package com.share.example.classload.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

/**
 * classpath 路径里面的类无法被加载的----需要修改底层的类加载器
 *
 * 应用场景---热部署
 */
@Slf4j
@Component
public class LoadClassPathConfig extends ClassLoader {

    public LoadClassPathConfig() {

    }

    public LoadClassPathConfig(ClassLoader parent) {
        super(parent);
    }

    /**
     * 系统会自动调用这个方法
     *
     * @param name
     * @return
     * @throws ClassNotFoundException
     */
    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        log.info("这个类正在被加载fileName={}", name);
        return findLoadedClass(name);


//        byte[] bytes = FileUtil.readByte(name);
//        int len = bytes.length;
//        log.info("这个类正在被加载fileName={},len={}", name, len);
//        return defineClass(null, bytes, 0, len);
    }

    @Override
    public Class<?> loadClass(String name) throws ClassNotFoundException {
        log.info("这个类正在被加载fileName={}", name);
        return super.loadClass(name);
    }

//    @PostConstruct
//    public void loadClassToJvm() {
//        log.info("###正在初始化类加载###");
//        File dirHome = new File(encryptClassDirHome);
//        for (File file : dirHome.listFiles()) {
//            String fileName = file.getName();
//            if (file.isFile() && fileName.endsWith(".class")) {
//                try {
//                    //手动触发去加载类
//                    Class<?> aClass = findClass(file.getAbsolutePath());
//
//                    //实例化一下这个类
//                    aClass.newInstance();
//                } catch (Exception e) {
//                    e.printStackTrace();
//                }
//            }
//        }
//        log.info("###类加载完毕###");
//    }

}
